home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / floptst.asm < prev    next >
Assembly Source File  |  1991-08-15  |  10KB  |  230 lines

  1. ; File......: FLOPTST.ASM
  2. ; Author....: Joseph LaCour
  3. ; Date......: $Date:   15 Aug 1991 23:07:48  $
  4. ; Revision..: $Revision:   1.2  $
  5. ; Log file..: $Logfile:   E:/nanfor/src/floptst.asv  $
  6. ; This is an original work by Joseph LaCour and is placed in the
  7. ; public domain.
  8. ;
  9. ;
  10. ;  ACKNOWLEDGEMENTS:
  11. ;
  12. ;          PAOLO RAMOZZI FOR HIS WORK IN DBDCHECK FOR SHOWING HOW TO
  13. ;          USE INT 13H.
  14. ;
  15. ;
  16. ; Modification history:
  17. ; ---------------------
  18. ;
  19. ; $Log:   E:/nanfor/src/floptst.asv  $
  20. ;  
  21. ;     Rev 1.2   15 Aug 1991 23:07:48   GLENN
  22. ;  Forest Belt proofread/edited/cleaned up doc
  23. ;  
  24. ;     Rev 1.1   11 May 1991 00:21:42   GLENN
  25. ;  File header changed to conform to Toolkit standard.
  26. ;
  27.  
  28. ;  $DOC$
  29. ;  $FUNCNAME$
  30. ;      FT_FLOPTST()
  31. ;  $CATEGORY$
  32. ;      DOS/BIOS
  33. ;  $ONELINER$
  34. ;      Test diskette drive status
  35. ;  $SYNTAX$
  36. ;      FT_FLOPTST( <nDrive> ) -> nStatus
  37. ;  $ARGUMENTS$
  38. ;      <nDrive> is the diskette drive number, 0 = A:, 1 = B:
  39. ;  $RETURNS$  
  40. ;      -1 - Wrong Parameters
  41. ;       0 - Drive Loaded and ready to read or write
  42. ;       1 - Drive Door Open or Diskette inserted upside down
  43. ;       2 - Diskette is unformatted
  44. ;       3 - Write protected
  45. ;       4 - Undetermined
  46. ;  $DESCRIPTION$
  47. ;      FT_FLOPTST() is designed as a full replacement for ISDRIVE().  Where
  48. ;      ISDRIVE() returns just .T. or .F. depending if the diskette drive is
  49. ;      ready or not, FT_FLOPTST() returns a numeric code designating the
  50. ;      diskette drive's status.
  51. ;
  52. ;      FT_FLOPTST() is particularly useful in backup and restore programs
  53. ;      that need to test the floppy drive before writing/reading from a
  54. ;      floppy disk.
  55. ;  $EXAMPLES$
  56. ;      iStatus := FT_FLOPTST( 1 )
  57.  
  58. ;      DO CASE
  59. ;         CASE iStatus == 1
  60. ;            Qout( "The door to drive A is open." )
  61. ;         CASE iStatus == 2
  62. ;            Qout( "The diskette in drive A is not formatted." )
  63. ;         CASE iStatus == 3
  64. ;            Qout( "The diskette in drive A is write-protected." )
  65. ;         CASE iStatus == 4
  66. ;            Qout( "Something is wrong with drive A, but I don't know what." )
  67. ;      ENDCASE
  68. ;  $END$
  69.  
  70.  
  71. public  FT_FLOPTST
  72.  
  73. EXTRN   __PARNI:FAR
  74. EXTRN   __PARINFO:FAR
  75. EXTRN   __RETNI:FAR
  76.  
  77. _FT_DATASEG  SEGMENT PUBLIC  'DATA'
  78.  
  79. FDRIVE          DB      0
  80. BOOT_SECT       DB      512 DUP (0)
  81.  
  82. _FT_DATASEG  ENDS
  83.  
  84. _NANFOR   SEGMENT 'CODE'
  85.         ASSUME  CS:_NANFOR,DS:_FT_DATASEG,ES:_FT_DATASEG,SS:NOTHING
  86.  
  87.  
  88. FT_FLOPTST      PROC    FAR
  89.  
  90.                 XOR     AX,AX                        ; GET # OF PARAMETERS
  91.                 PUSH    AX                           ;
  92.                 CALL    __PARINFO                    ; CALL INFORMATION FUNCTION
  93.                 ADD     SP,2                         ; FIX UP THE STACK
  94.                 CMP     AL,1                         ; # OF PARAMETERS = 1 ?
  95.                 JNB     GETTYPE                      ; YES. GET THE TYPE
  96.                 JMP     SHORT FERROR                 ; NO. RETURN ERROR
  97.  
  98. GETTYPE:
  99.                 MOV     AX,1                         ; SPECIFY FIRST PARAM
  100.                 PUSH    AX
  101.                 CALL    __PARINFO                    ; CALL INFO FUNCTION
  102.                 ADD     SP,2                         ; FIX UP THE STACK
  103.                 TEST    AX,2                         ; NUMERIC?
  104.                 JNZ     GETDRIVE                     ; YES.  GET DRIVE
  105.                 JMP     SHORT FERROR                 ; NO.  REPORT ERROR
  106.  
  107. GETDRIVE:
  108.                 MOV     AX,1                         ; GET 1ST PARAMETER (drive)
  109.                 push    ax                           ;
  110.                 call    __parni                      ; must be a integer type
  111.                 add     sp,2                         ; fix up the stack
  112.                 push    ax                           ; save drive
  113.                 int     11h                          ; get equipment list
  114.                 mov     ah,0                         ; clear high byte
  115.                 mov     cl,6                         ; set shift count
  116.                 shr     al,cl                        ; shift diskette count
  117.                 pop     bx                           ; restore drive
  118.                 cmp     bl,al                        ; does drive exist?
  119.                 jbe     ParamOk                      ; yes, so continue
  120. derror:         jmp     short Ferror                 ; Invalid drive
  121.  
  122. ParamOk:
  123.                 push    ds                           ; Save DS
  124.                 mov     dx,_FT_DATASEG               ; DATA SEGMENT
  125.                 MOV     DS,DX                        ; IN DS REGISTER
  126.                 MOV     ES,DX                        ; IN ES REGISTER
  127.                 MOV     FDRIVE,AL                    ; SAVE DRIVE NUMBER
  128.                 XOR     AX,AX                        ; RESET DISKETTE SYSTEM
  129.                 INT     13H                          ; CALL BIOS
  130.                 CALL    _FTFLOPT                     ; TEST DISKETTE TYPE
  131.                 POP     DS                           ; RESTORE DS
  132.                 JMP     SHORT EXIT                   ; RETURN
  133.  
  134. FERROR:
  135.                 MOV     AX,-1                        ; BAD PARAMETERS
  136.  
  137. EXIT:
  138.                 PUSH     AX                          ; PUSH RETURN VALUE
  139.                 CALL     __RETNI                     ; AND RETURN IT TO CLIPPER
  140.                 ADD      SP,2                        ; FIX UP THE STACK
  141.  
  142.                 RET                                  ; FAR RETURN TO CLIPPER
  143.  
  144. FT_FLOPTST      ENDP
  145.  
  146. ;-----------------------------------------------------------;
  147. ; LOCAL SUBROUTINE - CALL BIOS INT 13 FOR READ SECTOR       ;
  148. ;-----------------------------------------------------------;
  149.  
  150. _FTINT13        PROC    NEAR
  151.                 PUSH    BX                           ; SAVE REGS
  152.                 PUSH    ES                           ;
  153.                 PUSH    AX                           ;
  154.                 INT     13H                          ; CALL BIOS (read sector)
  155.                 jnc     ftIntRet                     ; Read ok. Exit
  156.                 xor     ax,ax                        ; reset diskette system
  157.                 int     13h                          ; call BIOS
  158.                 pop     ax                           ; restore regs
  159.                 pop     es                           ; for retry
  160.                 push    es                           ; save regs
  161.                 push    ax                           ;
  162.                 int     13h                          ; call BIOS (read sector)
  163.                 jnc     ftIntRet                     ; Read ok. Exit
  164.                 xor     ax,ax                        ; reset diskette system
  165.                 int     13h                          ; call BIOS
  166.                 pop     ax                           ; restore regs
  167.                 pop     es                           ; for retry
  168.                 push    es                           ; save regs
  169.                 push    ax                           ;
  170.                 int     13h                          ; call BIOS (read sector)
  171. ftIntRet:       pop     bx                           ; restore regs
  172.                 pop     es                           ;
  173.                 pop     bx                           ;
  174.                 ret                                  ; near return
  175.  
  176. _ftint13        endp
  177.  
  178. ;-----------------------------------------------------------;
  179. ; Local subroutine - check boot sector                      ;
  180. ;-----------------------------------------------------------;
  181.  
  182. _ftflopt        proc    near
  183.  
  184.                 push    di                           ; preserve
  185.                 mov     di,OFFSET _FT_DataSeg:boot_sect   ; address of buffer
  186. ftflopred:
  187.                 xor     dx,dx                        ; clear DX
  188.                 mov     dl,fdrive                    ; drive number in DL
  189.                 mov     cx,0001h                     ; track 0, sector 1
  190.                 mov     bx,di                        ; buffer addr in ES:BX
  191.                 mov     ax,0201h                     ; read one sector
  192.                 call    _ftint13                     ; call BIOS
  193.                 jnc     Flop1                        ; Read ok. Continue
  194.                 cmp     ah,80h                       ; drive not ready ?
  195.                 je      Flop_out                     ; Yes.
  196.                 cmp     ah,02h                       ; unformatted?
  197.                 je      Flop_for                     ; Yes
  198.                 mov     ax,4                         ; otherwise, unknown
  199.                 jmp     short Flop_End               ; and exit
  200. Flop1:
  201.                 xor     dx,dx                        ; clear DX
  202.                 mov     dl,fdrive                    ; drive number in DL
  203.                 mov     cx,0001h                     ; track 0, sector 1
  204.                 mov     bx,di                        ; buffer addr in ES:BX
  205.                 mov     ax,0301h                     ; write one sector
  206.                 call    _ftint13                     ; call BIOS
  207.                 jnc     Flop_OK                      ; Write ok. Disk s/b AOK
  208.                 cmp     ah,03h                       ; Write protected?
  209.                 jne     Flop_OK                      ; No disk AOK
  210.                 mov     ax,3
  211.                 jmp     short Flop_End
  212. Flop_out:
  213.                 mov     ax,1
  214.                 jmp     short Flop_End
  215. Flop_for:
  216.                 mov     ax,2
  217.                 jmp     short Flop_End
  218. Flop_OK:
  219.                 xor     ax,ax                        ; AX = 0
  220. Flop_End:
  221.                 pop     di                           ; restore
  222.                 ret                                  ; near return
  223.  
  224. _ftflopt        endp
  225.  
  226. _nanfor         ends
  227.                 end
  228.  
  229.